"""
Python爬虫架构主要由五个部分组成，分别是调度器、URL管理器，网页下载器，网页解析器，应用程序
调度器：
URL管理器：
网页下载器：
网页解析器：
应用程序：

Scrapy爬虫框架：Scrapy，Python开发的一个快速、高层次的屏幕抓取和web抓取框架，用于抓取web站点并从页面中提取结构化的数据。
Scrapy用途广泛，可以用于数据挖掘、监测和自动化测试。
Scrapy吸引人的地方在于它是一个框架，任何人都可以根据需求方便的修改。
"""
import scrapy
from scrapy import Spider
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings


class SkuItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    image_urls = scrapy.Field()


class AmazonSpider(Spider):
    name = 'amazon'
    start_urls = ['https://www.amazon.cn/s?k=%E9%9B%80%E5%B7%A2&__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&ref=nb_sb_noss_1']

    def parse(self, response):
        detail_url = response.xpath('//*[@id="search"]/div[1]/div[2]/div/span[3]/div[1]/div/div/div/div/div[2]/div[1]/'
                                    'div/div/span/a/@href').extract()
        for url in detail_url:
            yield scrapy.Request(url="https://www.amazon.cn" + url, callback=self.parse_detail)
        next_url = response.xpath('//li[@class="a-last"]/a/@href').extract_first()
        if next_url:
            yield scrapy.Request(url="https://www.amazon.cn" + next_url, callback=self.parse)

    def parse_detail(self, response):
        item = SkuItem()
        item['name'] = response.xpath('//span[@id="productTitle"]/text()').extract_first().strip()
        item['price'] = response.xpath('//span[@id="priceblock_ourprice"]/text()').extract_first().lstrip('￥')
        image_urls = response.xpath('//*[@id="altImages"]//img/@src').extract()
        item["image_urls"] = [image_urls[i][:-28] + 'SX600.jpg' for i in range(len(image_urls) - 1)]
        yield item


if __name__ == "__main__":
    settings = get_project_settings()
    crawl = CrawlerProcess(settings)
    crawl.crawl(AmazonSpider)
    crawl.start()
